package com.higgins.lawapp.client.maintenance.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.higgins.lawapp.client.maintenance.presenter.DataItemPresenter;
import com.higgins.lawapp.client.settings.dataItemModel.DataItemContainerDTO;
import com.higgins.lawapp.client.settings.dataItemModel.DataItemDTO;
import com.higgins.lawapp.client.settings.dataItemModel.DataItemInstanceDTO;
import com.higgins.lawapp.client.settings.dataItemModel.DataItemLevelDTO;
import com.higgins.lawapp.client.settings.dataItemModel.DataItemSourceDTO;
import com.higgins.lawapp.client.settings.rpc.DataItemService;
import com.higgins.lawapp.client.settings.rpc.DataItemServiceAsync;
import com.higgins.lawapp.client.settings.rpc.DataSourceService;
import com.higgins.lawapp.client.settings.rpc.DataSourceServiceAsync;

public class DataItemModel {
	private final DataSourceServiceAsync dataSourceService = GWT.create(DataSourceService.class);	
	private final DataItemServiceAsync dataItemService = GWT.create(DataItemService.class);	
	private DataItemSourceDTO dataItemSourceDTOSelected;
	private DataItemLevelDTO dataItemLevelDTOSelected;
	private DataItemInstanceDTO dataItemInstanceDTOSelected;
	private Boolean parentEdit;
	private List<DataItemDTO> dataItemDTOs;
	private DataItemDTO dataItemDTOSelected;
	private DataItemPresenter dataItemPresenter;
	private Integer selectedRow = 0;
	private Integer dataItemDTOSelectedIndex;
	
	public DataItemModel(DataItemPresenter dataItemPresenter)	{
		this.dataItemPresenter = dataItemPresenter;
	}
	public List<DataItemDTO> getDataItemDTOs()	{
		return dataItemDTOs;
	}
	public int getDataItemDTOsSize()	{
		return dataItemDTOs.size();
	}
	public DataItemDTO getDataItemDTO(int index)	{
		if (dataItemDTOs.size() > index)
			return dataItemDTOs.get(index);
		else 
			return null;
	}
	public DataItemDTO getSelectedDataItemDTO()	{
		return dataItemDTOSelected;
	}
	public void setSelectedRow(int row)	{
		if (row==0)
			selectedRow = null;
		else	{
			selectedRow = row-1;
			dataItemDTOSelected = dataItemDTOs.get(row-1);
//			dataItemPresenter.updateEmployeeTable();
		}
	}
	public void setDataItemSourceSeleced(DataItemSourceDTO dataItemSourceDTOSelected)	{
		this.dataItemSourceDTOSelected = dataItemSourceDTOSelected;
	}
	public void setDataItemLevelSelected(DataItemLevelDTO dataItemLevelDTOSelected)	{
		this.dataItemLevelDTOSelected = dataItemLevelDTOSelected;
		parentEdit = true;
	}
	public void setDataItemInstanceSelected(DataItemInstanceDTO dataItemInstanceDTOSelected)	{
		this.dataItemInstanceDTOSelected = dataItemInstanceDTOSelected;
		if (dataItemInstanceDTOSelected!=null)	{
			retrieveDataItemContainer();
		}
		else
			dataItemDTOs = null;
		parentEdit = false;
	}
	public void deleteDataItemSourceDTO()	{
		if (dataItemSourceDTOSelected!=null)	{
			dataItemService.deleteDataItemSource(dataItemSourceDTOSelected,
			new AsyncCallback<String>() {
				public void onFailure(Throwable caught) {
				}

				public void onSuccess(String result) {
					dataItemPresenter.updateDataItemTable();
				}
			});		
		}
	}
	
	public void deleteDataItemLevelDTO()	{
		if (dataItemLevelDTOSelected!=null)	{
			dataItemService.deleteDataItemLevel(dataItemLevelDTOSelected,
			new AsyncCallback<String>() {
				public void onFailure(Throwable caught) {
				}

				public void onSuccess(String result) {
					dataItemPresenter.updateDataItemTable();
				}
			});		
		}
	}
	
	public void updateDataItemDTO(String text, int row, int column)	{
		dataItemDTOSelectedIndex = (row-1);
		dataItemDTOSelected = dataItemDTOs.get(dataItemDTOSelectedIndex);
		switch(column)	{
		case 1:
			dataItemDTOSelected.setItemOne(text);
			break;
		case 2:
			dataItemDTOSelected.setItemTwo(text);
			break;
		}
//		updateDataItem(parentEdit, dataItemDTOSelectedIndex, dataItemDTOSelected);	THIS NEEDS TO BE REWRITTEN
	}				
	/*
	private void updateDataItem(Boolean parentEdit, int dataItemDTOSelected, DataItemDTO dataItemDTO)	{
		if (parentEdit)	{
			// Set Level Data
			dataItemService.updateLevelDataItem(
						dataItemSourceDTOSelected.getDataItemSourceName(),
						dataItemLevelDTOSelected.getDataItemLevelName(),
						dataItemDTOSelected, dataItemDTO,
						
								new AsyncCallback<String>() {
									public void onFailure(Throwable caught) {
									}
				
									public void onSuccess(String result) {
										dataItemPresenter.updateDataItemTable();
									}
								});		
		} else {
			// Set Instance Data
			dataItemService.updateInstanceDataItem(
					dataItemSourceDTOSelected.getDataItemSourceName(),
					dataItemLevelDTOSelected.getDataItemLevelName(),
					dataItemInstanceDTOSelected.getDataItemInstance(),
					dataItemDTOSelected, dataItemDTO,
					
								new AsyncCallback<String>() {
									public void onFailure(Throwable caught) {
									}
				
									public void onSuccess(String result) {
										dataItemPresenter.updateDataItemTable();
									}
								});	
		}
	}			*/
		
	public void deleteRows()	{
		dataItemDTOSelected = null;
		deleteRow();
	}
	public void deleteRow()	{
		dataItemService.deleteDataItem(dataItemDTOSelected, new AsyncCallback<String>() {
					public void onFailure(Throwable caught) {
					}

					public void onSuccess(String result) {
						dataItemPresenter.updateDataItemTable();
					}
				});	
	}
	public void retrieveRows()	{
		dataItemService.retrieveDataItems(
				new AsyncCallback<List<DataItemSourceDTO>>() {
					public void onFailure(Throwable caught) {
					}

					public void onSuccess(List<DataItemSourceDTO> result) {
						dataItemPresenter.setDataItemDTOs(result);
					}
				});	
	}
	/*
	public void retrieveInstance()	{
		dataItemService.retrieveDataItemInstance(dataItemSourceDTOSelected.getDataItemSourceName(), dataItemLevelDTOSelected.getDataItemLevelName(), 
				dataItemInstanceDTOSelected.getDataItemInstance(), 

				new AsyncCallback<List<DataItemInstanceDTO>>()	{      
					public void onFailure(Throwable caught)		{
					}
					
					public void onSuccess(List<DataItemInstanceDTO> result)		{
						dataItemPresenter.setDataItemInstanceDTOs(result);
					}
		
			
		});
	}	*/
	public void retrieveDataItemContainer()	{
		String sourceName = dataItemSourceDTOSelected.getDataItemSourceName();
		String levelName = dataItemLevelDTOSelected.getDataItemLevelName();
		String instanceName = dataItemInstanceDTOSelected.getDataItemInstance();
		
		dataItemService.retrieveDataItemContainers(sourceName, levelName, instanceName, 
				new AsyncCallback<DataItemContainerDTO>()	{      
					public void onFailure(Throwable caught)		{
						System.out.println("Retrieve DataItem Container FAILED!!");
					}
					
					public void onSuccess(DataItemContainerDTO dataItemContainer)		{
						List<String> dataItemTitles = new ArrayList<String>();
						if (dataItemContainer.getDataItems()!=null)	{
							if (dataItemContainer.getDataTitleOne()!=null)
								dataItemTitles.add(dataItemContainer.getDataTitleOne());
							if (dataItemContainer.getDataTitleTwo()!=null)
								dataItemTitles.add(dataItemContainer.getDataTitleTwo());
							if (dataItemContainer.getDataTitleThree()!=null)
								dataItemTitles.add(dataItemContainer.getDataTitleThree());
							if (dataItemContainer.getDataTitleFour()!=null)
								dataItemTitles.add(dataItemContainer.getDataTitleFour());
							if (dataItemContainer.getDataTitleFive()!=null)
								dataItemTitles.add(dataItemContainer.getDataTitleFive());
						} 
						
						if (dataItemContainer.getDataItems()!=null)	
							if (dataItemContainer.getDataItems().size() > 0)
								dataItemPresenter.setDataItemContainer(dataItemContainer.getDataItems(), dataItemTitles);
					}
		});
	}
	
}
